@奈良山
2年前 提问
1个回答

Java安全开发应该注意些什么

帅末
2年前

Java安全开发需要注意如下方面:

  • 保持代码的简洁:相对而言,越复杂的代码越容易出现问题,所以开发者应该尽量保持代码的简洁。

  • 测试中尽可能模拟线上环境:生产过程中一个典型的场景就是只使用1到3个帐户进行测试,而这个数量本应是1000到2000个的。在做性能测试时,使用的数据必须是真实并且未经裁剪的。不贴近真实环境的性能测试,可能会带来不可预料的性能、拓展和多线程问题。这里也可以采取预发布环境的方式来解决部分问题。

  • 及时更新依赖组件版本:在Java开发中,开发者经常会用到各类开源组件来实现自己的功能点,但是许多开发者不常关注安全资讯,不了解开源组件的哪个版本存在什么样的漏洞,从而可能会引入安全漏洞。以在选择开源组件版本的时候,应优先选择最新发布的组件,因为最新版本的组件通常都会解决历史安全问题,因此使用最新版本组件可以将安全风险降到最低。

  • 将一些需要变动的配置写在属性文件中:比如,没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置。那么你的程序无论在DEV环境中,还是TEST环境中,都可以顺畅无阻地运行,但是一旦部署在PROD上,把它作为多线程程序处理更大的数据集时,就会抛出IOException,原因也许是线上环境并发造成也许是其他。如果线程数目可以在属性文件中配置,那么使它成为一个单线程应用程序就变得十分容易了。我们不再需要为了解决问题而反复地部署和测试应用了。这种方法也同样适用于配置URL、服务器和端口号等。这里推荐使用属性文件外化这些配置,文件格式使用properties、yaml、hocon、json都可以。下面的类实现了对这些格式的文件的spring注入支持,包括占位符支持。

  • 安全设计上一个系统要遵循最小权限原则:网络服务随处可见,从而使得黑客可以轻易地利用它进行拒绝服务攻击。所以,设计系统时,需要遵循“最小权限”原则,采用白名单等方式。

  • 对于外部调用及内部服务都要做容错处理:不管是RPC调用还是对于第三方服务的调用,都不能想当然的认为可用性是100%的。不允许出现服务调用超时和重试,将会对应用程序的稳定性和性能造成不利的影响。

  • 做好系统关键功能的监控、错误恢复、备份:对于系统一些至关重要的功能模块要做好对其的监控,防止其影响系统的运行,造成不可估算的损失。另外,如果可以,监控到故障后去去试图恢复,恢复失败再发送告警。对于一些很重要的数据文件,还要做到冗余备份,防止发生一些突然故障造成数据丢失。

  • 制定好项目回滚计划:新的功能上线时,如果发生故障,没有一份回滚计划,那么可能会手忙脚乱而造成线上服务一段时间不可用。有一个良好的回滚计划,可以让你能够有条不紊的执行相关操作,在可控时间内将系统恢复到一个可运行的状态。

  • 项目上线前要做好量化分析:对于项目中用到的内存、数据库、文件、缓存等,要做好量化分析。预估出未来一段时间的空间占用,给运维分配机器时一个参考。防止,由于数据量增长过快,导致存储不够。这一点是非常重要的,不然很容易造成线上服务不可用。

  • 在一些关键技术领域具有充足的知识储备:在关键的技术领域比如设计模式、JVM调优、多线程“并发问题”、事务问题,包括分布式事务、性能问题,包括GC、计算等、缓存等方面,具有充足的知识储备。

  • 选择最合适的工具/技术:很多情况下,开发者会在生产系统中使用一门想要学习的语言或某种工具。通常这不是最好的选择。比如,为已经实际上是关系型的数据使用NoSQL数据库。不管是语言还是工具,都有其适用的场景。不能求新,也不能以“自我”为标准。

  • 添加安全相关的HTTP请求头:现代浏览器已经支持很多和安全相关的请求头(header),当添加这些HTTP安全请求头时,浏览器在处理网站内容时会应用相应的安全机制,能够缓解XSS,代码注入,点击劫持等攻击方式。例如,使用Strict-Transport-Security(严格安全传输),就可以强制要求浏览器仅通过HTTPS进行通信。

  • 异常信息不输出给用户:异常对象引起的错误返回可能包含敏感信息,在系统抛出异常后,异常信息如果输出给用户,可能会被攻击者利用。例如控制输入参数来暴露应用程序的内部结构和机制,异常消息文本和异常类型可能会泄露信息,以 FileNotFoundException 为例。这些消息包含有关文件系统布局的信息,异常类型显示丢失的请求文件。为了保护 Java 代码应用程序,开发者们应该过滤异常消息和异常类型,避免直接暴露给用户。

  • 避免记录敏感信息:开发者们在开发过程中,会接收到来自用户的许多敏感信息,例如信用卡和银行卡号码、身份证、手机号和密码等信息,这些对犯罪分子来说是高度敏感和有价值的,数据盗窃对个人和组织造成巨大伤害。开发者们应避免将此类信息明文存储在日志文件中。 如果必须用到身份证等任何敏感信息,可以考虑仅记录身份证号的特征信息,例如最后四位数字或者hash,并确保使用经过验证的脱敏工具库对其进行加密。